iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
Modern Web

前後端整合,用Spring boot 與React 開發屬於自己的記帳網頁系列 第 20

Day20 前端React開發:更新記帳資訊與刪除資料

  • 分享至 

  • xImage
  •  

前言

我們在前一天成功的讀取到資料庫的資料,並且顯示到React中,接下來我們要進一步,讓資料能夠更新並且存到後端中,當這些都完成之後,就只剩下刪除這個功能,而刪除這個功能也很簡單,我們合併到今天來製作。
那就讓我們開始,學習如何更新記帳資訊與刪除資料吧!

更新記帳資訊

首先,我們要先去Service.js這個地方,去新增更新資料的功能。
更新資料的程式碼如下,我們需要提供的是id跟我們要更新的資訊,我們使用put的方法來執行更新,並且要輸入id跟account這些資料

export const updateAccount = (id,account) => axios.put(BASE_REST_API_URL+'/'+id,account);

接下來,我們回到AccountComponet,也就是新增/修改的頁面中。
我們之前已經實作了根據是否有id帳號來決定呈現的是add或者是update資料,也教大家如何寫出function來控制呈現的畫面,再來就是調整saveAccount這個function,同樣根據是否有id數值來調整項目。
這裡可以看到,我們新增了一個if的判斷,如果id存在,那我們就執行update的動作,並且引導到主頁面中,若有錯誤訊息則顯示再console中,如果沒有id,我們就當作是新增資料,進行單純的新增資料操作

    function saveAccount(e){
        e.preventDefault()
        if(id){
          const account = {id,name,category,amount,expensed}
          updateAccount(id,account).then((res)=>
            navigate('/')
          ).catch(error =>{
           console.log(error)
          })
        }else{
          const account = {name,category,amount,expensed}
          console.log(account)
          //將資料傳給後端
          navigate('/')
          addAccount(account).then((response)=>{
            console.log(response.data)
            }).catch(error =>{
            console.log(error)
          })
        }
      }

完整的程式碼如下

import { useState , useEffect } from 'react'
import { addAccount, getAccount, updateAccount } from '../Service/AccountService'
import { useNavigate,useParams } from 'react-router-dom'
const AccountComponent = () => {
    const [name, setName] = useState('')
    const [category,setCategory] = useState('')
    const [amount,setAmount] = useState('')
    const [expensed,setExpensed] = useState(false)
    const navigate = useNavigate()
    const {id} = useParams()
    useEffect(()=>{
      
      if(id){
        getAccount(id).then((res)=>{
          //console.log("This is the res"+res.data)
          setName(res.data.name)
          setCategory(res.data.category)
          setAmount(res.data.amount)
          setExpensed(res.data.expensed)
        }).catch(error =>{
          console.error(error)
        })
      }
    },[id])
    function saveAccount(e){
        e.preventDefault()
        if(id){
          const account = {id,name,category,amount,expensed}
          updateAccount(id,account).then((res)=>
            navigate('/')
          ).catch(error =>{
           console.log(error)
          })
        }else{
          const account = {name,category,amount,expensed}
          console.log(account)
          //將資料傳給後端
          navigate('/')
          addAccount(account).then((response)=>{
            console.log(response.data)
            }).catch(error =>{
            console.log(error)
          })
        }
      }
      function pageTitle(){
        if(id){
          return <h2 className='text-center' >Update Account</h2>
        }else{
          return <h2 className='text-center'>Add Todo</h2>
        }
      }
    
  return (
    <div className='container'>
        <br></br>
        <div className='card col-md-6 offest-md-3 offset-md-3'>
        <br></br>
        {pageTitle()}
        <div className='card-body'>
              <form>
                <div className='form-group mb-2 text-center'>
                     <label className='form-label'>Account Title</label>
                     <input
                            type='text'
                            className='form-control'
                            placeholder='Enter Account Name'
                            value={(name)}
                           onChange={(e)=>setName(e.target.value)}  
                       ></input>
                </div>
                <div className='form-group mb-2 text-center'>
                       <label className='form-label'>Account Category:</label>
                       <input
                            type='text'
                            className='form-control'
                            placeholder='Enter Account Category'
                            value={(category)}
                           onChange={(e)=>setCategory(e.target.value)}  
                       ></input>
                </div>
                <div className='form-group mb-2 text-center'>
                       <label className='form-label'>Account Amount:</label>
                       <input
                            type='text'
                            className='form-control'
                            placeholder='Enter Account Amount'
                            value={(amount)}
                           onChange={(e)=>setAmount(e.target.value)}  
                       ></input>
                </div>
                <div className='form-group mb-2 text-center'>
                      <label className='form-label'>Account expense:</label>
                      <select
                      className='form-control'
                      value={expensed}
                      onChange={(e)=> setExpensed(e.target.value)}
                         >
                      <option value='false'>支出</option>
                      <option value='true'>收入</option>
                    </select>
                </div>
                <button className='btn btn-success' onClick={(e)=>saveAccount(e)}>Submit</button>
              </form>
            </div>
        </div>
    </div>
  )
}
export default AccountComponent

當我們修改好之後,儲存回到主頁,就會看到以下的清單。
https://ithelp.ithome.com.tw/upload/images/20240928/20152864wCdkzovx1I.png
接下來,我們來更新資料,我這邊以午餐便當為例,點選Update,然後就會跳出以下畫面
https://ithelp.ithome.com.tw/upload/images/20240928/2015286429cChRdvl8.png
接下來,修改內容變成豐盛的排骨便當,其他的內容都不改變。大家要改變也可以根據喜好修改,要注意的是Category盡量保持一致,可以是food,也可以是食物,但相同類型都需要有相同的名稱。
都修改完成之後,按下Submit鍵。
https://ithelp.ithome.com.tw/upload/images/20240928/20152864lvzjsudLaq.png
修改完成之後,就會跳回主頁,然後就看到我們的便當資訊變成了豐盛的排骨便當
https://ithelp.ithome.com.tw/upload/images/20240928/20152864OeF9TGGKdr.png
再來,我們就要新增刪除功能了

刪除資料

我們在前面的頁面中已經新增好了刪除資料的按鈕與空的功能,接下來就要開始正式實作了。
我們先回到Service.js中新增deleteAccount

export const deleteAccount = (id)=>axios.delete(BASE_REST_API_URL+'/'+id);

再來回到ListAccounyComponent中,在delete中新增這個功能

function deletedAccount(id){
        //刪除Account
        deleteAccount(id).then(()=>{
            listAccounts()
        }).catch(error =>{
            console.log(error)
        })
    }

完整的程式碼如下

import React, { useEffect, useState } from 'react'
import { deleteAccount, getAllAccounts } from '../Service/AccountService'
import {useNavigate} from 'react-router-dom'
function ListAccountCompinent() {
    const [accounts,setAccounts] = useState([])
    const navigate = useNavigate()
    useEffect(()=>{
        listAccounts();
    },[])
    function listAccounts(){
        getAllAccounts().then((response)=>{
            setAccounts(response.data);
        }).catch(error =>{
            console.error(error)
        })
    }
    function addNewAccount(){
     navigate('/add-account')
    }
    function updateAccount(id){
        // 更新Account
        console.log(id)
        navigate(`/update-account/${id}`)
    }
    function deletedAccount(id){
        //刪除Account
        deleteAccount(id).then(()=>{
            listAccounts()
        }).catch(error =>{
            console.log(error)
        })
    }
  return (
    <div className='container'>
        <h2 className='text-center'>List of Todos</h2>
        <button className='btn btn-primary mb-2' onClick={addNewAccount}>Add Account</button>
        <div>
          <table className='table table-bordered table-striped'>
                <thead>
                    <tr>
                        <th>Account Name</th>
                        <th>Account Category</th>
                        <th>Account amount</th>
                        <th>Account expense</th>
                        <th>Actions</th>
                    </tr>
                </thead>
                <tbody>
                    {
                        accounts.map(account => 
                            <tr key={account.id}>
                                <td>{account.name}</td>
                                <td>{account.category}</td>
                                <td>{account.amount}</td>
                                <td>{account.expesned ? '收入':'支出'}</td>
                                <td>
                                    <button className='btn btn-info' onClick={()=> updateAccount(account.id)}>Update</button>
                                    <button className='btn btn-danger' onClick={()=> deletedAccount(account.id)} style={{marginLeft:"10px"}}>Delete</button>
                                </td>
                            </tr>
                        )
                    }
                </tbody>
            </table>
        </div>
    </div>
  )
}
export default ListAccountCompinent

撰寫完之後記得儲存,然後先新增一個帳目,我這邊先新增了123這個資料,然後對這個資料按下delete
https://ithelp.ithome.com.tw/upload/images/20240928/20152864s5i9Z2l2m3.png
成功的話你就會看見,資料被你正確的刪除了!
https://ithelp.ithome.com.tw/upload/images/20240928/20152864W66Vlfif7U.png
完成刪除動作後,我們就完成了完整的前端CRUD。
能做到這裡的你,已經學會了完整個前端、後端的CRUD,以及React的操作,我相信已經初步的掌握了前後端開發的基礎了。


上一篇
Day19 React前端開發 修改記帳頁面開發-顯示修改記帳頁面
下一篇
Day21 Spring boot 後端 開發 篩選類別功能API
系列文
前後端整合,用Spring boot 與React 開發屬於自己的記帳網頁30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言